#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
文件格式转换工具 - EXE打包脚本
使用PyInstaller将应用程序打包成可执行文件
"""

import os
import sys
import subprocess
from pathlib import Path

def build_exe():
    """构建EXE文件"""
    print("文件格式转换工具 - EXE打包")
    print("=" * 40)
    
    # 获取当前目录
    current_dir = Path(__file__).parent
    main_script = current_dir / "main.py"
    
    if not main_script.exists():
        print("错误: 找不到main.py文件")
        return False
    
    # PyInstaller命令参数
    cmd = [
        "python", "-m", "PyInstaller",
        "--onefile",                    # 打包成单个exe文件
        "--windowed",                   # 不显示控制台窗口
        "--name=文件格式转换工具",        # 设置exe文件名
        "--icon=icon.ico",              # 图标文件(如果存在)
        "--add-data=converter.py;.",    # 包含转换模块
        "--add-data=dependency_checker.py;.",  # 包含依赖检查模块
        "--add-data=media_preview.py;.",       # 包含媒体预览模块
        "--hidden-import=PyQt6",        # 确保PyQt6被包含
        "--hidden-import=PyQt6.QtCore",
        "--hidden-import=PyQt6.QtGui",
        "--hidden-import=PyQt6.QtWidgets",
        "--hidden-import=docx",         # 确保docx模块被包含
        "--hidden-import=openpyxl",     # 确保openpyxl模块被包含
        "--hidden-import=pptx",         # 确保pptx模块被包含
        "--hidden-import=PyPDF2",       # 确保PyPDF2模块被包含
        "--hidden-import=pandas",       # 确保pandas模块被包含
        "--hidden-import=PIL",          # 确保Pillow模块被包含
        "--hidden-import=cv2",          # 确保OpenCV模块被包含
        "--hidden-import=librosa",      # 确保librosa模块被包含
        "--hidden-import=soundfile",    # 确保soundfile模块被包含
        "--hidden-import=pydub",        # 确保pydub模块被包含
        "--collect-all=PyQt6",          # 收集所有PyQt6相关文件
        "--collect-submodules=docx",    # 收集docx子模块
        "--collect-submodules=openpyxl", # 收集openpyxl子模块
        "--collect-submodules=pptx",    # 收集pptx子模块
        "--collect-submodules=PIL",     # 收集PIL子模块
        "--distpath=dist",              # 输出目录
        "--workpath=build",             # 工作目录
        "--specpath=.",                 # spec文件位置
        str(main_script)                 # 主脚本文件
    ]
    
    # 检查是否存在图标文件
    icon_file = current_dir / "icon.ico"
    if not icon_file.exists():
        # 移除图标参数
        cmd = [arg for arg in cmd if not arg.startswith("--icon")]
        print("注意: 未找到icon.ico文件，将使用默认图标")
    
    print("开始打包...")
    print(f"命令: {' '.join(cmd)}")
    print()
    
    try:
        # 执行PyInstaller命令
        result = subprocess.run(cmd, cwd=current_dir, capture_output=True, text=True)
        
        if result.returncode == 0:
            print("✅ 打包成功!")
            print(f"EXE文件位置: {current_dir / 'dist' / '文件格式转换工具.exe'}")
            print()
            print("注意事项:")
            print("1. 首次运行可能需要较长时间")
            print("2. 如需使用LibreOffice转换功能，请确保目标机器已安装LibreOffice")
            print("3. 如需使用其他外部工具，请确保目标机器已安装相应工具")
            return True
        else:
            print("❌ 打包失败!")
            print("错误信息:")
            print(result.stderr)
            return False
            
    except Exception as e:
        print(f"❌ 打包过程中发生错误: {e}")
        return False

def clean_build():
    """清理构建文件"""
    import shutil
    
    current_dir = Path(__file__).parent
    
    # 要清理的目录和文件
    clean_targets = [
        current_dir / "build",
        current_dir / "__pycache__",
        current_dir / "文件格式转换工具.spec"
    ]
    
    print("清理构建文件...")
    for target in clean_targets:
        if target.exists():
            if target.is_dir():
                shutil.rmtree(target)
                print(f"已删除目录: {target}")
            else:
                target.unlink()
                print(f"已删除文件: {target}")
    
    print("清理完成")

if __name__ == "__main__":
    import argparse
    
    parser = argparse.ArgumentParser(description="文件格式转换工具 - EXE打包脚本")
    parser.add_argument("--clean", action="store_true", help="清理构建文件")
    
    args = parser.parse_args()
    
    if args.clean:
        clean_build()
    else:
        success = build_exe()
        if not success:
            sys.exit(1)